package main

import "fmt"

// 感觉 过去 还是 指针 理解 不到位
// 今天 又看一遍
// 就是 变量 定义名字了， 才可以 对他 取地址
// 程序里 能访问的 最深 的 地址， 就是 &变量名，直接 &&变量名 是 非法的
// 想访问 更深的 地址 就要 给它（&变量名） 分配个 变量名

// https://blog.csdn.net/nxpzmj/article/details/9715735

type Node struct {
	Val  int
	Next *Node
}

func (node *Node) add(l []int) {
	cur := node
	for _, v := range l {
		fmt.Print(v, " -> ")
		cur.Next = &Node{Val: v}
		cur = cur.Next
	}
	fmt.Println()
}

func (node *Node) show() {
	cur := node
	for cur != nil {
		fmt.Print(cur.Val, " -> ")
		cur = cur.Next
	}
	fmt.Println()
}

func del_head(head **Node) {
	for curr := head; *curr != nil; {
		entry := *curr
		if (**curr).Val == 0 {
			*curr = entry.Next
		} else {
			curr = &entry.Next
		}
	}
}

func change_node_p(node **Node) {
	tmp := &Node{Val: 1}
	*node = tmp
}

func main() {
	a := &Node{}

	a.add([]int{1, 2, 3})
	a.show()

	println("删除前")
	println("*Node 的 地址", a)
	println("**Node 的  地址", &a)

	del_head(&a)
	fmt.Println("del head")
	a.show()

	println("删除后")
	println("*Node 的 地址", a)
	println("**Node 的  地址", &a)

	// 分别使用 一级指针 二级指针 修改 一个 指针 的 值
	n1 := Node{Val: 1}
	n2 := Node{Val: 2}
	p1 := &n1
	// p2 := &n2
	fmt.Println("p1 val: ", p1.Val)
	p1 = &n2
	fmt.Println("p1 val: ", p1.Val)
	pp1 := &p1
	*pp1 = &n1
	fmt.Println("p1 val: ", p1.Val)

	p3 := &Node{Val: 3}
	change_node_p(&p3)
	fmt.Println("p3 val: ", p3.Val)
}
